home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 4
/
Meeting Pearls Vol. IV (1996)(GTI - Schatztruhe)[!].iso
/
Pearls
/
gfx
/
Viewer
/
CyberAnim
/
source.lha
/
unpack.s
< prev
Wrap
Text File
|
1996-09-08
|
11KB
|
452 lines
multipass
mc68000
xdef _unpackbytedelta
xdef _unpackbytedeltanodirty
xdef _unpackanim7long
xdef _unpackanim7longnodirty
;void __asm unpackbytedelta (register __a0 BYTE *bdata,
; register __a1 PLANEPTR plane,
; register __d0 WORD bytesperrow,
; register __a2 WORD *dirty);
; d1 = x
; d2 = tmp
; d3 = count
; d4 = w
; d5 = first
; d6 = last
; d7 = ub, temporary
; a3 = bp
; a4 = y
_unpackbytedelta
movem.l d2-d7/a2-a4,-(sp)
ext.l d0 ; bytesperrow
moveq #0,d1 ; x = 0
.xloop moveq #-1,d5 ; first = -1
moveq #-1,d6 ; last = -1
movea.l a1,a3 ; bp = plane
addq.l #1,a1 ; plane++
suba.l a4,a4 ; y = 0
moveq #0,d3
move.b (a0)+,d3 ; count = *bdata++
bra .endloop2
.loop2 moveq #0,d4
move.b (a0)+,d4 ; w = *bdata++
ble 1$ ; branch if w <= 0
adda.l d4,a4 ; y += w
mulu.w d0,d4
adda.l d4,a3 ; bp += w * bytesperrow
.endloop2 dbra d3,.loop2
bra .endxloop
1$ beq 3$ ; branch if w == 0
tst.w d5
bge 2$ ; branch if first >= 0
move.w a4,d5 ; first = y
2$ and.w #$7f,d4 ; w &= 0x7f
adda.l d4,a4 ; y += w
move.w a4,d6 ; last = y
move.w d4,d7
lsr.w #3,d4
and.w #7,d7
add.w d7,d7
add.w d7,d7
neg.w d7
jmp (.endwloop,pc,d7.w)
.wloop move.b (a0)+,(a3) ; *bp = *data++
adda.l d0,a3 ; bp += bytesperrow
move.b (a0)+,(a3) ; *bp = *data++
adda.l d0,a3 ; bp += bytesperrow
move.b (a0)+,(a3) ; *bp = *data++
adda.l d0,a3 ; bp += bytesperrow
move.b (a0)+,(a3) ; *bp = *data++
adda.l d0,a3 ; bp += bytesperrow
move.b (a0)+,(a3) ; *bp = *data++
adda.l d0,a3 ; bp += bytesperrow
move.b (a0)+,(a3) ; *bp = *data++
adda.l d0,a3 ; bp += bytesperrow
move.b (a0)+,(a3) ; *bp = *data++
adda.l d0,a3 ; bp += bytesperrow
move.b (a0)+,(a3) ; *bp = *data++
adda.l d0,a3 ; bp += bytesperrow
.endwloop dbra d4,.wloop
dbra d3,.loop2
bra .endxloop
3$ tst.w d5
bge 4$ ; branch if first >= 0
move.w a4,d5 ; first = y
4$ moveq #0,d7
move.b (a0)+,d7 ; ub = *bdata++
adda.l d7,a4 ; y += ub
move.w a4,d6 ; last = y
move.b (a0)+,d4 ; w = *bdata++
move.w d7,d2
lsr.w #3,d7
and.w #7,d2
add.w d2,d2
add.w d2,d2
neg.w d2
jmp (.endubloop,pc,d2.w)
.ubloop move.b d4,(a3) ; *bp = w
adda.l d0,a3 ; bp += bytesperrow
move.b d4,(a3) ; *bp = w
adda.l d0,a3 ; bp += bytesperrow
move.b d4,(a3) ; *bp = w
adda.l d0,a3 ; bp += bytesperrow
move.b d4,(a3) ; *bp = w
adda.l d0,a3 ; bp += bytesperrow
move.b d4,(a3) ; *bp = w
adda.l d0,a3 ; bp += bytesperrow
move.b d4,(a3) ; *bp = w
adda.l d0,a3 ; bp += bytesperrow
move.b d4,(a3) ; *bp = w
adda.l d0,a3 ; bp += bytesperrow
move.b d4,(a3) ; *bp = w
adda.l d0,a3 ; bp += bytesperrow
.endubloop dbra d7,.ubloop
dbra d3,.loop2
.endxloop tst.w d5
blt 8$ ; branch if first < 0
move.w (a2),d7
blt 5$ ; branch if dirty[0] < 0
cmp.w d5,d7
ble 6$ ; branch if dirty[0] <= first
5$ move.w d5,(a2) ; dirty[0] = first
6$ move.w (2,a2),d7
blt 7$ ; branch if dirty[1] < 0
cmp.w d6,d7
bge 8$ ; branch if dirty[1] >= last
7$ move.w d6,(2,a2) ; dirty[1] = last
8$ move.w d1,d7
and.w #3,d7
cmp.w #3,d7
bne 9$
addq.l #4,a2 ; dirty += 2
9$ addq.w #1,d1 ; x++
cmp.w d0,d1
blt .xloop ; branch if x < bytesperrow
movem.l (sp)+,d2-d7/a2-a4
rts
;{
; WORD x, y, count, w, first, last;
; BYTE *bp;
; UBYTE ub;
;
; for (x = 0; x < bytesperrow; x++) {
; first = -1;
; last = -1;
; bp = &plane[x];
; y = 0;
; for (count = *bdata++; count > 0; count--) {
; if ((w = *bdata++) > 0) {
; y += w;
; bp += w * bytesperrow;
; } else if (w < 0) {
; if (first < 0)
; first = y;
; last = (y += (w &= 0x7f));
; for ( ; w > 0; w--) {
; *bp = *bdata++;
; bp += bytesperrow;
; }
; } else /* w == 0 */ {
; if (first < 0)
; first = y;
; last = (y += (ub = (UBYTE)*bdata++));
; w = *bdata++;
; for ( ; ub > 0; ub--) {
; *bp = w;
; bp += bytesperrow;
; }
; }
; }
; if (first >= 0 && (dirty[0] < 0 || first < dirty[0]))
; dirty[0] = first;
; if (last >= 0 && (dirty[1] < 0 || last > dirty[1]))
; dirty[1] = last;
; if ((x & 3) == 3)
; dirty += 2;
; }
;}
;void __asm unpackbytedeltanodirty (register __a0 BYTE *bdata,
; register __a1 PLANEPTR plane,
; register __d0 WORD bytesperrow);
; d1 = bytesperrrow - x
; d3 = count
; d4 = w
; d7 = ub, temporary
; a3 = bp
_unpackbytedeltanodirty
movem.l d2-d7/a2-a3,-(sp)
ext.l d0 ; bytesperrow
move.l d0,d1 ; x
bra .endxloop
.xloop movea.l a1,a3 ; bp = plane
addq.l #1,a1 ; plane++
moveq #0,d3
move.b (a0)+,d3 ; count = *bdata++
bra .endloop2
.loop2 moveq #0,d4
move.b (a0)+,d4 ; w = *bdata++
ble 1$ ; branch if w <= 0
mulu.w d0,d4
adda.l d4,a3 ; bp += w * bytesperrow
.endloop2 dbra d3,.loop2
bra .endxloop
1$ beq 3$ ; branch if w == 0
and.w #$7f,d4 ; w &= 0x7f
move.w d4,d6
lsr.w #3,d4
and.w #7,d6
add.w d6,d6
add.w d6,d6
neg.w d6
jmp (.endwloop,pc,d6.w)
.wloop move.b (a0)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.b (a0)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.b (a0)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.b (a0)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.b (a0)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.b (a0)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.b (a0)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.b (a0)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
.endwloop dbra d4,.wloop
dbra d3,.loop2
bra .endxloop
3$ moveq #0,d7
move.b (a0)+,d7 ; ub = *bdata++
move.b (a0)+,d4 ; w = *bdata++
move.w d7,d6
lsr.w #3,d7
and.w #7,d6
add.w d6,d6
add.w d6,d6
neg.w d6
jmp (.endubloop,pc,d6.w)
.ubloop move.b d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.b d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.b d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.b d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.b d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.b d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.b d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.b d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
.endubloop dbra d7,.ubloop
dbra d3,.loop2
.endxloop dbra d1,.xloop
movem.l (sp)+,d2-d7/a2-a3
rts
;void __asm unpackanim7long (register __a0 BYTE *bdata,
; register __a4 LONG *data,
; register __a1 PLANEPTR plane,
; register __d0 WORD bytesperrow,
; register __a2 WORD *dirty);
; d1 = x
; d2 = y
; d3 = count
; d4 = w
; d5 = first
; d6 = last
; d7 = ub, temporary
; a3 = lp
_unpackanim7long
movem.l d2-d7/a2-a4,-(sp)
ext.l d0 ; bytesperrow
moveq #0,d1 ; x = 0
.xloop moveq #-1,d5 ; first = -1
moveq #-1,d6 ; last = -1
movea.l a1,a3 ; lp = plane
addq.l #4,a1 ; plane++
moveq #0,d2 ; y = 0
moveq #0,d3
move.b (a0)+,d3 ; count = *bdata++
bra .endloop2
.loop2 moveq #0,d4
move.b (a0)+,d4 ; w = *bdata++
ble 1$ ; branch if w <= 0
add.w d4,d2 ; y += w
mulu.w d0,d4
adda.l d4,a3 ; lp += w * bytesperrow
bra .endloop2
1$ beq 3$ ; branch if w == 0
tst.w d5
bge 2$ ; branch if first >= 0
move.w d2,d5 ; first = y
2$ and.w #$7f,d4 ; w &= 0x7f
add.w d4,d2 ; y += w
move.w d2,d6 ; last = y
bra .endwloop
.wloop move.l (a4)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
.endwloop dbra d4,.wloop
bra .endloop2
3$ tst.w d5
bge 4$ ; branch if first >= 0
move.w d2,d5 ; first = y
4$ moveq #0,d7
move.b (a0)+,d7 ; ub = *bdata++
add.w d7,d2 ; y += ub
move.w d2,d6 ; last = y
move.l (a4)+,d4 ; w = *data++
bra .endubloop
.ubloop move.l d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
.endubloop dbra d7,.ubloop
.endloop2 dbra d3,.loop2
tst.w d5
blt 8$ ; branch if first < 0
move.w (a2),d7
blt 5$ ; branch if dirty[0] < 0
cmp.w d5,d7
ble 6$ ; branch if dirty[0] <= first
5$ move.w d5,(a2) ; dirty[0] = first
6$ move.w (2,a2),d7
blt 7$ ; branch if dirty[1] < 0
cmp.w d6,d7
bge 8$ ; branch if dirty[1] >= last
7$ move.w d6,(2,a2) ; dirty[1] = last
8$ addq.l #4,a2 ; dirty += 2
addq.w #4,d1 ; x += 4
cmp.w d0,d1
blt .xloop ; branch if x < bytesperrow
movem.l (sp)+,d2-d7/a2-a4
rts
;void __asm unpackanim7longnodirty (register __a0 BYTE *bdata,
; register __a4 LONG *data,
; register __a1 PLANEPTR plane,
; register __d0 WORD bytesperrow);
; d1 = (bytesperrow - x) >> 2
; d3 = count
; d4 = w
; d7 = ub, temporary
; a3 = lp
_unpackanim7longnodirty
movem.l d2-d7/a2-a4,-(sp)
ext.l d0 ; bytesperrow
move.w d0,d1
lsr.w #2,d1
bra .endxloop
.xloop movea.l a1,a3 ; lp = plane
addq.l #4,a1 ; plane++
moveq #0,d3
move.b (a0)+,d3 ; count = *bdata++
bra .endloop2
.loop2 moveq #0,d4
move.b (a0)+,d4 ; w = *bdata++
ble 1$ ; branch if w <= 0
mulu.w d0,d4
adda.l d4,a3 ; lp += w * bytesperrow
.endloop2 dbra d3,.loop2
bra .endxloop
1$ beq 3$ ; branch if w == 0
2$ and.w #$7f,d4 ; w &= 0x7f
move.w d4,d6
lsr.w #3,d4
and.w #7,d6
add.w d6,d6
add.w d6,d6
neg.w d6
jmp (.endwloop,pc,d6.w)
.wloop move.l (a4)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.l (a4)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.l (a4)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.l (a4)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.l (a4)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.l (a4)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.l (a4)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
move.l (a4)+,(a3) ; *lp = *data++
adda.l d0,a3 ; lp += bytesperrow
.endwloop dbra d4,.wloop
dbra d3,.loop2
bra .endxloop
3$ moveq #0,d7
move.b (a0)+,d7 ; ub = *bdata++
move.l (a4)+,d4 ; w = *data++
move.w d7,d6
lsr.w #3,d7
and.w #7,d6
add.w d6,d6
add.w d6,d6
neg.w d6
jmp (.endubloop,pc,d6.w)
.ubloop move.l d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.l d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.l d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.l d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.l d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.l d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.l d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
move.l d4,(a3) ; *lp = w
adda.l d0,a3 ; lp += bytesperrow
.endubloop dbra d7,.ubloop
dbra d3,.loop2
.endxloop dbra d1,.xloop
movem.l (sp)+,d2-d7/a2-a4
rts
end